package ufc.sd.dao;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.List;

import me.prettyprint.hector.api.Cluster;
import me.prettyprint.hector.api.Keyspace;
import me.prettyprint.hector.api.ddl.ComparatorType;
import me.prettyprint.hector.api.factory.HFactory;
import ufc.sd.entities.Aluno;
import ufc.sd.entities.Curso;

public class DatabaseUtil {

	public static final String KS_UNIVERSIDADE = "Universidade";
	private static Cluster cluster;
	private static Keyspace ksUniversidade;

	private DatabaseUtil() {
	}

	public static void initDatabase(boolean clearKeyspace) {
		if (cluster == null) {
			cluster = HFactory.getOrCreateCluster("test-cluster", "localhost:9160");
			createKeyspace(cluster, clearKeyspace);
		}
	}

	public static Cluster getCluster() {
		return cluster;
	}

	public static Keyspace getKeyspace() {
		return ksUniversidade;
	}

	public static void clearKeyspace() {
		getCluster().dropKeyspace(KS_UNIVERSIDADE);
		ksUniversidade = null;
	}

	private static void createKeyspace(Cluster cluster, boolean clearKeyspace) {
		boolean keyspaceExists = clusterHasKeyspace(cluster, KS_UNIVERSIDADE);
		if (keyspaceExists && clearKeyspace) {
			cluster.dropKeyspace(KS_UNIVERSIDADE);
		}
		if (!keyspaceExists || clearKeyspace) {
			cluster.addKeyspace(HFactory.createKeyspaceDefinition(KS_UNIVERSIDADE));
			cluster.addColumnFamily(HFactory.createColumnFamilyDefinition(KS_UNIVERSIDADE, AlunoDAO.CF_ALUNO,
					ComparatorType.UTF8TYPE));
			cluster.addColumnFamily(HFactory.createColumnFamilyDefinition(KS_UNIVERSIDADE, CursoDAO.CF_CURSO,
					ComparatorType.UTF8TYPE));
			ksUniversidade = HFactory.createKeyspace(KS_UNIVERSIDADE, cluster);
			fillDatabase();
		} else {
			ksUniversidade = HFactory.createKeyspace(KS_UNIVERSIDADE, cluster);
		}
	}

	public static boolean clusterHasKeyspace(Cluster cluster, String keyspace) {
		return cluster.describeKeyspace(KS_UNIVERSIDADE) != null;
	}

	public static void fillDatabase() {
		List<Curso> cursos = fillCursosColumnFamily();
		fillAlunosColumnFamily(cursos);
	}

	private static List<Curso> fillCursosColumnFamily() {
		List<Curso> cursos = Arrays.asList(new Curso(65 + "", "Computação", "Centro de Ciências"), new Curso(10 + "", "Letras",
				"Centro de Ciências Humanas"), new Curso(30 + "", "Engenharia Elétrica", "Centro de Tecnologia"));
		CursoDAO.getInstance().insertAll(cursos);
		return cursos;
	}

	private static List<Aluno> fillAlunosColumnFamily(List<Curso> cursos) {
		List<Aluno> alunos = new ArrayList<Aluno>();
		for (int i = 1; i <= 1; i++) {
			Calendar dataNascimento = Calendar.getInstance();
			dataNascimento.set(2000 - i, (i - 1) % 12 - 1, i % 20);
			alunos.add(new Aluno(i + "", "Aluno No. " + i, dataNascimento.getTime(), cursos.get((i - 1) % cursos.size())));
		}
		AlunoDAO.getInstance().insertAll(alunos);
		return alunos;
	}
}
